Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Libp2p stream limits #1017

Merged
merged 14 commits into from
Dec 28, 2022
Merged

Libp2p stream limits #1017

merged 14 commits into from
Dec 28, 2022

Conversation

nazar-pc
Copy link
Member

@nazar-pc nazar-pc commented Dec 12, 2022

This implements stream libp2p stream limits as described in https://www.notion.so/subspacelabs/libp2p-stream-limits-b787bd71ce6f400d95e781c69932d112

There is some extra minor refactoring in separate commits, but overall the changes are these:

  • subspace-networking has more conservative stream limits (comparing to defaults)
  • different tasks launched against networking use part of limited networking capacity for requests and too many requests will be queued
  • now unnecessary batching restrictions and corresponding CLI parameters were removed
  • capacity is somewhat elastic and scaled with number connected peers

NOTE: It is expected that you'll see this message until other nodes are updated:

dropping (Stream 41d73bd4/8040) because buffer is full

Code contributor checklist:

@@ -272,6 +311,18 @@ impl Node {
&self,
key: Multihash,
) -> Result<impl Stream<Item = Vec<u8>>, GetValueError> {
let kademlia_permit = self
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can the shared::Command be split into something like shared::{KademliaCommand, GlobalCommand}, and the corresponding async task in node_runner::handle_command() also be split? This way, the semaphores also can be separated, and avoid having to take both of them for kademlia specific tasks

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kademlia limits are a subset of global limits, hence I don't think we want to split them. Unless we subtract Kademlia limits from global, which is actually an interesting and probably good idea, but even then I don't see how splitting commands will help as the bottleneck we're considering here is connection level streams in libp2p that are shared between different behavior, including Kademlia.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah I see, yeah in that case splitting doesn't help.

Just that some paths grabbing 1 sem, others grabbing 2 makes it bit harder to reason about. Would be great if these can be unified

const GLOBAL_CONCURRENT_TASKS_BOOST_PER_PEER: usize = 2;
const SEMAPHORE_MAINTENANCE_INTERVAL: Duration = Duration::from_secs(5);

async fn maintain_semaphore_permits_capacity(
Copy link
Contributor

@rahulksnv rahulksnv Dec 12, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Guess semaphores are not best fit for this scenario, where the max limit can grow/shrink as peers come and go. Hence we need this complexity to hold excess permits, etc

How do you feel about this:

  1. Maintain current_max_limit, current_usage. These two are protected by async Mutex/CV.
  2. current_max_limit can be updated with the boost_per_peer from handle_swarm_event() during connection open/close.
  3. Senders: wait for permits to be freed, add to current_usage
  4. From drop() of the permit: bump up current_usage, signal any waiters. But, any excess permits if the max limit shrinked are not returned to the free pool. This would need spawning async task from the dtor unfortunately, as rust doesn't support await from drop yet.

Happy to make a branch off your PR and make a draft, if that helps (also to get my feet weet)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is a bit hacky, I agree, but not too much (for my taste).

I found CVs counter-intuitive to read in most cases and I feel like we'll implement essentially the same mechanism (practically speaking) in the end. It might be an interesting exercise, but I'm not sure it'll actually be a lot of value in that.

Supporting what we need here (resizing, dropping of unfinished acquisition) is probably quire a bit of effort.

Feel free to try unless you have anything more valuable to do.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, looks like tokio doesn't have CondVar, so that won't work :-( But found sem has a forget() API: https://docs.rs/tokio/1.23.0/tokio/sync/struct.SemaphorePermit.html#method.forget

This can help avoid the reserved_permits stash, which would simplify this quite a bit:

if total_permits < expected_total_permits {
     semaphore.add_permits(expected_total_permits - total_permits);
} else {
     let num_excess = total_permits - expected_total_permits;
     // acquire()/forget() num_excess permits
}

Not a big deal: it may take a while for the changes to take effect (in the shrink case), as the sem acquisition in this path doesn't get higher priority (unless done from the dtor as in the other approach)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can use forget, but that'll mean we'll permanently increase internal capacity of the semaphore every time we call forget. And while we'll probably never reach https://docs.rs/tokio/1.23.0/tokio/sync/struct.Semaphore.html#associatedconstant.MAX_PERMITS on 64-bit platform, we can on 32-bit platform. It'll take a while, but when you hit it, it'll be hard to debug.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah you are right.

I still feel this path can be simplified (took a bit to figure out this shrinking business), let me try out the idea I mentioned above off your branch.

i1i1
i1i1 previously approved these changes Dec 13, 2022
Comment on lines +297 to +302
let shared = match self.shared_weak.upgrade() {
Some(shared) => shared,
None => {
return;
}
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a note. We can do this right now:

let Some(shared) = self.shared_weak.upgrade() else { return };

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is exactly what I wrote initially. Unfortunately rustfmt seems to be unable to format let .. else, which is why I'm not using it yet anywhere. I'll be checking with new Rust releases as we upgrade and will start using it once formatting works.

Copy link
Contributor

@shamil-gadelshin shamil-gadelshin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good work! It will significantly simplify concurrency management. However, I have a couple of major concerns:

  • maintain_semaphore_permits_capacity requires testing with edge cases
  • all Node methods should be protected from incorrect semaphore.acquire_permit ordering by introducing wrapping-methods
  • WrapperWithPermits uses Vec for semaphore permits which doesn't guarantee drop order.

boost_per_peer: usize,
) {
let base_permits = semaphore.available_permits();
// Total permits technically supported by semaphore
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This method is critical for maintaining concurrent requests feature and despite extensive comments is still hard to read. I recommend converting it to the testable version and applying several tests including edge cases.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made maintenance interval an argument and wrote some tests

}

pub async fn put_value(
&self,
key: Multihash,
value: Vec<u8>,
) -> Result<impl Stream<Item = ()>, PutValueError> {
let kademlia_permit = self
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The order of the semaphore access is important. With some combination of the permit number, we could experience race conditions. Let's have two wrapper methods for all kademlia- and non-kademlia-methods with the fixed order of acquiring resources. The wrapper method should acquire semaphores and return a WrapperWithPermits for the inner command.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will also reduce similar copy-paste code in the methods.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I made two semaphores non-overlapping, so you only need to take one and not both. Hope it helps. And you are right about ordering, it can be a source of issues.

Copy link
Member Author

@nazar-pc nazar-pc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added connected_peers-1, which was missing, some tests and made semaphores non-overlapping, inspired by Rahul's comments.

boost_per_peer: usize,
) {
let base_permits = semaphore.available_permits();
// Total permits technically supported by semaphore
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made maintenance interval an argument and wrote some tests

}

pub async fn put_value(
&self,
key: Multihash,
value: Vec<u8>,
) -> Result<impl Stream<Item = ()>, PutValueError> {
let kademlia_permit = self
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I made two semaphores non-overlapping, so you only need to take one and not both. Hope it helps. And you are right about ordering, it can be a source of issues.

Comment on lines +297 to +302
let shared = match self.shared_weak.upgrade() {
Some(shared) => shared,
None => {
return;
}
};
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is exactly what I wrote initially. Unfortunately rustfmt seems to be unable to format let .. else, which is why I'm not using it yet anywhere. I'll be checking with new Rust releases as we upgrade and will start using it once formatting works.

Copy link
Contributor

@shamil-gadelshin shamil-gadelshin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good but something is wrong:

shamix@shamix2 subspace % RUST_LOG=info ./target/debug/subspace-node --chain dev --tmp --execution wasm --pruning 1024 --keep-blocks 1024 --validator --force-authoring --rpc-max-subscriptions-per-connection=100000 --ws-max-connections=100000  --dsn-bootstrap-nodes=/ip4/127.0.0.1/tcp/50000/p2p/12D3KooWBTzCDwwRtkUz8unUFUDMP9wEhEDNPfNH6bsuhbz4RrRr
2022-12-13 16:58:37 Subspace    
2022-12-13 16:58:37 ✌️  version 0.1.0-b43bd6caa6d    
2022-12-13 16:58:37 ❤️  by Subspace Labs <https://subspace.network>, 2021-2022    
2022-12-13 16:58:37 📋 Chain specification: Subspace development    
2022-12-13 16:58:37 🏷  Node name: amuck-truck-1899    
2022-12-13 16:58:37 👤 Role: AUTHORITY    
2022-12-13 16:58:37 💾 Database: ParityDb at /var/folders/sh/t2v54wn12vbbdlt7_ytgkxbh0000gn/T/substratedxFRHX/chains/subspace_dev/paritydb/full    
2022-12-13 16:58:37 ⛓  Native runtime: subspace-1 (subspace-0.tx0.au0)    
2022-12-13 16:58:38 [PrimaryChain] 🔨 Initializing Genesis block/state (state: 0xf521…0b46, header-hash: 0x26c0…4be4)    
2022-12-13 16:58:39 [DSN] DSN instance configured. allow_non_global_addresses_in_dht=true peer_id=12D3KooWHQ81eUgapK2VzxNJReU4o46tL6chwBzMWFvCiyW2mcQe
2022-12-13 16:58:39 [PrimaryChain] Subspace networking initialized: Node ID is 12D3KooWHQ81eUgapK2VzxNJReU4o46tL6chwBzMWFvCiyW2mcQe
2022-12-13 16:58:39 [PrimaryChain] Starting archiving from genesis    
2022-12-13 16:58:39 [PrimaryChain] Archiving already produced blocks 0..=0    
2022-12-13 16:58:40 [PrimaryChain] Using default protocol ID "sup" because none is configured in the chain specs    
2022-12-13 16:58:40 [PrimaryChain] Processing a segment. segment_index=0
2022-12-13 16:58:40 [PrimaryChain] 🏷  Local node identity is: 12D3KooWHQ81eUgapK2VzxNJReU4o46tL6chwBzMWFvCiyW2mcQe    
2022-12-13 16:58:40 [PrimaryChain] 🧑‍🌾 Starting Subspace Authorship worker    
2022-12-13 16:58:40 [PrimaryChain] 💻 Operating system: macos    
2022-12-13 16:58:40 [PrimaryChain] 💻 CPU architecture: aarch64    
2022-12-13 16:58:40 [PrimaryChain] 📦 Highest known block at #0    
2022-12-13 16:58:40 [PrimaryChain] 〽️ Prometheus exporter started at 127.0.0.1:9615    
2022-12-13 16:58:40 [PrimaryChain] Running JSON-RPC HTTP server: addr=127.0.0.1:9933, allowed origins=Some(["http://localhost:*", "http://127.0.0.1:*", "https://localhost:*", "https://127.0.0.1:*", "https://polkadot.js.org"])    
2022-12-13 16:58:40 [PrimaryChain] Running JSON-RPC WS server: addr=127.0.0.1:9944, allowed origins=Some(["http://localhost:*", "http://127.0.0.1:*", "https://localhost:*", "https://127.0.0.1:*", "https://polkadot.js.org"])    
2022-12-13 16:58:40 [PrimaryChain] Piece publishing was successful. segment_index=0
2022-12-13 16:58:45 [PrimaryChain] 💤 Idle (0 peers), best: #0 (0x26c0…4be4), finalized #0 (0x26c0…4be4), ⬇ 0 ⬆ 0    
2022-12-13 16:58:50 [PrimaryChain] 💤 Idle (0 peers), best: #0 (0x26c0…4be4), finalized #0 (0x26c0…4be4), ⬇ 0 ⬆ 0    
2022-12-13 16:58:55 Accepting new connection 1/100000
2022-12-13 16:58:55 Accepting new connection 2/100000
2022-12-13 16:58:55 [PrimaryChain] 💤 Idle (0 peers), best: #0 (0x26c0…4be4), finalized #0 (0x26c0…4be4), ⬇ 0 ⬆ 0    
2022-12-13 16:59:00 [PrimaryChain] 💤 Idle (0 peers), best: #0 (0x26c0…4be4), finalized #0 (0x26c0…4be4), ⬇ 0 ⬆ 0    
2022-12-13 16:59:05 [PrimaryChain] 💤 Idle (0 peers), best: #0 (0x26c0…4be4), finalized #0 (0x26c0…4be4), ⬇ 0 ⬆ 0    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. No older substream waiting to be reused. Dropping new substream.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    
2022-12-13 16:59:10 New inbound substream to PeerId("12D3KooWLnjgzSammRdGG5vr6vSyfgauVhuvkNtKdgH1a4sqkJSW") exceeds inbound substream limit. Removed older substream waiting to be reused.    

i1i1
i1i1 previously approved these changes Dec 13, 2022
@nazar-pc nazar-pc marked this pull request as draft December 13, 2022 21:47
@rahulksnv rahulksnv mentioned this pull request Dec 13, 2022
1 task
@nazar-pc
Copy link
Member Author

Pushed two important updates, but PR is still in draft state, the reason is primarily puts that seem to be causing exceeding of incoming stream limits in Kademlia. Upstream discussion: libp2p/rust-libp2p#3235

* Add ResizableSemaphore

* Clean ups

* Add unit tests

* Use the sem changes

* Clean up

* Fix race

* Remove async lock

* Restructure

* Address comments

* Bring back threshold for bumping quota

* Address comments

* Fix expect message

Co-authored-by: Nazar Mokrynskyi <[email protected]>
@nazar-pc
Copy link
Member Author

Updated libp2p to upstream git version first to separate changes, then to our fork that contains just libp2p/rust-libp2p#3287 to fix concurrency issues we were hitting before.

Since pieces are relatively large and there are many of them, 5 seconds often wasn't enough to finish requests, so I increased it to make sure we can finish publishing of the piece before trying again.

Overall, seems to work well and ready for review again.

@nazar-pc nazar-pc marked this pull request as ready for review December 28, 2022 09:21
@nazar-pc
Copy link
Member Author

I have done testing locally against Gemini 3b and it looks promising, merging

@nazar-pc nazar-pc merged commit 3396465 into main Dec 28, 2022
@nazar-pc nazar-pc deleted the libp2p-stream-limits branch December 28, 2022 16:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants